package com.sxj.corejava.code07_面向对象.继承;

/**
 * @author 石小俊
 * @date 2024年03月19日 19:44
 */
public class Pet {

    private String name;
    private int age;

    public Pet(){

    }

    public Pet(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Pet(String name) {
        this.name = name;
    }

    public Pet(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

class Dog extends Pet {
    private String gender;
    private String name;

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    public Dog(String name, int age, String gender) {
        // super(参数)的用法在子类构造方法中只有出现一次
        // 且必须处于第一行
        super(name, age);
//        super(name);
//        super(age);
        this.gender = gender;
    }

    public Dog(){
        // 当访问父类无参构造方法时,可以省略super()
        // 即:不管如何,在构造子类对象时,一定会调用父类构造方法
        // 而调用了父类构造方法说明也创建一个父类对象
        super();
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public void show() {
        // 当子类存在与父类同名的属性或者方法时
        // 默认访问的是子类自己的,通过super.属性/方法的方式访问的是父类的
        // 当访问父类的方法或者属性与子类不存在同名时,可以省略super
        System.out.println("name:" + super.getName() + ",age:" + getAge() + ",gender:" + gender);
    }
}

class TestPet {
    public static void main(String[] args) {
        Dog dog = new Dog("tom", 5, "公");
        dog.setName("中华田园犬");
        dog.show();
    }
}
